package com.ftg.learn;

import com.ftg.learn.rbac.vo.PermissionVo;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Guo
 * @date 2022/2/9
 */
public class PermissionCon {

    public List<PermissionVo> init(){
        List<PermissionVo> list = new ArrayList<>();
        PermissionVo pvo = new PermissionVo();
        pvo.setPid(1);
        pvo.setParentId(-1);
        pvo.setTitle("aa");
        list.add(pvo);

        pvo = new PermissionVo();
        pvo.setPid(2);
        pvo.setParentId(-1);
        pvo.setTitle("bbb");
        list.add(pvo);

        pvo = new PermissionVo();
        pvo.setPid(3);
        pvo.setParentId(1);
        pvo.setTitle("cc");
        list.add(pvo);

        pvo = new PermissionVo();
        pvo.setPid(4);
        pvo.setParentId(1);
        pvo.setTitle("dd");
        list.add(pvo);

        pvo = new PermissionVo();
        pvo.setPid(5);
        pvo.setParentId(4);
        pvo.setTitle("ee");
        list.add(pvo);

        return list;
    }


    @Test
    public void PermissionCTRL(){
        List<PermissionVo> target = new ArrayList<>();
        createTree(target,init(),-1);
        System.out.println(target);
        target.forEach(System.out::println);
    }

    /**
     * 是不是应该把 pid 当做一个条件
     *      判断 pid 是否有子项
     *         list 里面有元素的parentid = pid 有
     *         。。。parentid所在这个元素添到pid childlist
     *         递归 pid
     *         return ;
     * @param pid 数据主键
     * @param target 目标
     * @param data 源数据
     * @return
     * pid -1
     */
    public void createTree(List<PermissionVo> target,List<PermissionVo> data,int pid) {
        if(findSon(data,pid)){
            data.forEach(x->{
                if(x.getParentId() == pid){
                    //一定要把x扔进去
                    PermissionVo parent = findParent(data,x);
                    if(parent == null){
                        target.add(x);// 把-1添加到的target  x.getPid();
                    }else{
                        parent.getChildList().add(x);
                    }
//                    data.remove(x);// 有可能会有问题
                    createTree(target,data,x.getPid());
                }
            });
        }
    }

    /**
     * 找子项
     * @param data 源数据
     * @param pid  主键 --- pid与parentId相同
     * @return
     */
    public boolean findSon(List<PermissionVo> data,int pid){
        return data.stream().anyMatch(x -> x.getParentId() == pid);
    }

    /**
     * 是不是存sno在 target里面是否有父亲,修改成递归 childList == null
     * @param target 父亲的所有元素
     * @param son    子元素
     * @return
     */
    public PermissionVo findParent(List<PermissionVo> target,PermissionVo son){
        for (PermissionVo permissionVo : target) {
            if(permissionVo.getPid().equals(son.getParentId())){
                return permissionVo;
            }else{
                findParent(permissionVo.getChildList(),son);
            }
        }
        return null;
    }

}
